from .tool import Tool
from typing import Dict, Callable, Any, List

ToolBuilder = Callable[[Any], Tool]
FuncToolBuilder = Callable[[], ToolBuilder]


class ToolsRegistry:
    def __init__(self) -> None:
        self.tools : Dict[str, FuncToolBuilder] = {}
    
    def register(self, tool_name : str, tool : FuncToolBuilder):
        print(f"will register {tool_name}")
        self.tools[tool_name] = tool
    
    def build(self, tool_name, config) -> Tool:
        ret = self.tools[tool_name]()(config)
        if isinstance(ret, Tool):
            return ret
        raise ValueError("Tool builder {} did not return a Tool instance".format(tool_name))
    
    def list_tools(self) -> List[str]:
        return list(self.tools.keys())

tools_registry = ToolsRegistry()

def register(tool_name):
    def decorator(tool : FuncToolBuilder):
        tools_registry.register(tool_name, tool)
        return tool
    return decorator

def build_tool(tool_name : str, config : Any) -> Tool:
    print(f"will build {tool_name}")
    return tools_registry.build(tool_name, config)

def list_tools() -> List[str]:
    return tools_registry.list_tools()
